
;; Copyright (C) Johan Ceuppens 2009 
;; This program is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 2 of the License, or
;; (at your option) any later version.

;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; GNU General Public License for more details.

;; You should have received a copy of the GNU General Public License
;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
(load "object.el")

(defun Magnitude (name)
  (let* ((*class "Magnitude")
	 (*instance-name name)
	 (*value nil)
	 ;;super class
	 (*super (Object name))

	 (*< 
	  (lambda (aMagnitude)
	    (< *value ((aMagnitude "value")))))

	 (*> 
	  (lambda (aMagnitude)
	    (> *value ((aMagnitude "value")))))

	 (*<= 
	  (lambda (aMagnitude)
	    (<= *value ((aMagnitude "value")))))

	 (*>=
	  (lambda (aMagnitude)
	    (>= *value ((aMagnitude "value")))))

	 (*min
	  (lambda (aMagnitude)
	    (if (<= *value ((aMagnitude "value")))
		*value)
	    (if (>= *value ((aMagnitude "value")))
		((aMagnitude "value")))))
	      
	 (*max
	  (lambda (aMagnitude)
	    (not (*min *value ((aMagnitude "value"))))))

	 (*dispatch 
	  (lambda (msg)
	    (print "calling method.\n")
	    (cond
	     ;;private methods
	     ((eq msg "value")
	      (lambda () *value))
	     ;;public methods
	     ((or (eq msg "name") (eq msg "instance-name"))
		   (lambda () *instance-name));;NOTE
	     ((eq msg "<")
	      *<)
	     ((eq msg ">")
	      *>)
	     ((eq msg "<=")
	      *<=)
	     ((eq msg ">=")
	      *>=)
	     ((eq msg "min:")
	      *min)
	     ((eq msg "max:")
	      *max)

	     (t	((*super msg))	    
		;;(error "Invalid method call"))
		))))
	 )
    
    *dispatch))
